Spring Boot学习

Spring Boot学习

Spring Boot环境

一、版本仲裁

使用idea新建spring boot项目,pom.xml文件中自动导入一个父项目依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.1.RELEASE</version>
</dependency>

它是spring-boot所有starter的父项目,点进去看,这个依赖还有一个父项目

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.3.1.RELEASE</version>
  </parent>

再点进去,可以看到里面有一个properties标签,里面有很多依赖的版本

这个项目是用来真正管理spring boot中所有依赖的版本的,我们称其为spring boot的版本仲裁中心,以后导入依赖默认是不需要版本的,但是没有在版本仲裁中心声明的依赖还是要声明版本号

二、场景启动器

我们要启动一个web项目,还有一个依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.1.RELEASE</version>
</dependency>

点进去看

里面有很多我们所需要使用的依赖,这个spring-boot-starter-web称为spring boot场景启动器,帮我们导入web模块正常运行所依赖的组件
spring boot将所有的功能场景都抽取出来,做成一个个的starter(启动器),只需要在项目中引入这些starter,相关场景的所有依赖都会导入进来,要用什么功能就导入什么场景启动器,我们可以去官网上找到自己需要的启动器依赖启动器文档

启动

一、启动类

/**
 * @SpringBootApplication : 来标记一个主程序类,说明这是一个spring boot应用
 * 它实际上是一个组合注解,等同于:
 * @Target({ElementType.TYPE})
 * @Retention(RetentionPolicy.RUNTIME)
 * @Documented
 * @Inherited
 * @SpringBootConfiguration
 * @EnableAutoConfiguration
 * @ComponentScan(
 *     excludeFilters = {@Filter(
 *     type = FilterType.CUSTOM,
 *     classes = {TypeExcludeFilter.class}
 * ), @Filter(
 *     type = FilterType.CUSTOM,
 *     classes = {AutoConfigurationExcludeFilter.class}
 * )}
 * )
 */
@SpringBootApplication
public class springBootDemoApplication {
    public static void main(String[] args) {
        //springboot应用启动起来,需要传入一个含有@SpringBootApplication注解的类
        SpringApplication.run(springBootDemoApplication.class,args);
    }
}

@SpringBootConfiguration

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
···
}
spring boot的配置类,标记在某个类上,表示这是一个spring boot的配置类,实质上是一个@Configuration,被@Configuration注解注释的类称为配置类,是spring中用来替代众多xml配置文件的类,配置类也是容器中的一个组件,被@Component注解注释  

@EnableAutoConfiguration
将主配置类(@SpringBootApplication注解注释的类)的所在包及下面所有子包里面的所有组件扫描到spring容器中

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
···
}
开启自动配置功能,以前需要配置的东西,spring boot帮我们配置,@EnableAutoConfiguration告诉spring boot开启自动配置功能
    @Import({AutoConfigurationImportSelector.class})
    AutoConfigurationImportSelector(组件导入选择器):将所有需要导入的组件以全类名的方式返回,给容器中导入非常多的自动配置类(xxxAutoConfiguration),并配置好这些组件

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @Import({Registrar.class})
    public @interface AutoConfigurationPackage {
    ···
    }

        @Import({Registrar.class}):spring的底层注解,给容器导入组件
        static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
            Registrar() {
            }

            public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
                AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
            }

            public Set<Object> determineImports(AnnotationMetadata metadata) {
                return Collections.singleton(new AutoConfigurationPackages.PackageImports(metadata));
            }
        }


总结:spring boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作,以前我们需要进行配置的东西,自动配置类都帮我们配置。
J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfiguration-(版本).RELEASE.jar包下,我们也可以自定义配置

@ComponentScan

配置

两种配置文件格式:
    application.properties
    application.yml
固定写法,不能变,修改spring boot自动配置的默认值

PS:还可以使用banner.txt修改spring boot启动时的字符图片

一、application.yml

YAML简介

YAML(YAML Ain't Markup Language)
    YAML A Markup Language:是一个标记语言
    YAML isn't Markup Language:不是一个标记语言
标记语言:
    以前的配置文件,大多都是使用xxxx.xml文件
YAML:以数据为中心,比json、xml等更适合做配置文件

YAML基本语法

1.使用缩进表示层级关系
2.缩进时不允许使用tab制表符键,只允许使用空格
3.缩进的空格数据不重要,只要相同层级的元素左侧对齐即可
4.大小写敏感
5.属性和值之间也要空格,如port: 8081

YAML支持的三种数据结构

1.对象:键值对的集合
多行写法
    friends:
        name: zhangsan
        age: 20
单行写法
    friends: {name: zhangsan,age: 20}
2.数组:一组按次序排列的值
    用- 表示数组中的一个元素
    多行写法:
        pets:
            - cat
            - dog
            - pig
    单行写法:
        pets: [cat,dog,pig]
3.字面量:单个的、不可再分的值
    key: value
    字符串默认不用加''或者""
            "":不会转义字符串里面的特殊字符
                name: "zhangsan \n lisi",输出:zhangsan 换行 lisi
            '':会转义特殊字符
                name:"zhangsan \n lisi",输出:zhangsan \n lisi

@ConfigurationProperties注解

/**
 * 1.在yml中配置了
 * person:
 *   name: zhangsan
 *   age: 20
 * 2.还要将配置文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties(prefix = "person"): 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
 *      prefix = "person":指定配置文件中哪个对象下面的所有属性进行一一映射
 * 3.注意只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能,所有要使用@Component注解注释
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

这里加个依赖,可以让我们在yml中输入对象的属性时,提示我们属性名称

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

二、application.properties


注意,idea中要配置properties文件编码为utf-8,且勾上在运行时转换为ASCII码,不然会乱码


 上一篇
泛型 泛型
泛型一、概念是一种未知的数据类型,当我们不知道使用什么数据类型的时候,可以使用泛型,泛型也可以看成是一个变量,用来接收数据类型。 E e:Element 元素T t:Type 类型 ArrayList集合在定义的时候,不知道集合中都
2020-11-13
下一篇 
java中的深拷贝和浅拷贝 java中的深拷贝和浅拷贝
java中的深拷贝和浅拷贝 环境:Idea:2019.3.1系统:windows10 家庭版Jdk: 8java中文api 拷贝一. 引用拷贝 二. 对象拷贝 浅拷贝class Person(){ private Name nam
2020-04-23
  目录